package com.example.sunming.fanshe;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * @author: sunming
 * @date: 2020/4/10
 * @description: 反射测试类
 */
public class TestFanshe {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException,
            InstantiationException, NoSuchMethodException, InvocationTargetException {
        // 1、获取字节码文件对象Class
        Object obj = new Person();
        Class<?> aClass = obj.getClass();
        System.out.println("通过getClass():" + aClass);

        Class<Person> cla = Person.class;
        System.out.println("通过类名.class：" + cla);

        Class<?> clas = Class.forName("com.example.sunming.fanshe.Person");
        System.out.println("通过类的全限定名:" + clas);

        // 2、实例化对象
        // 不用反射:创建对象，需要手动new对象不能动态创建
        // new的时候根据new的类名寻找字节码文件，加载进入内存，创建Class对象，并接着创建对应的Proson对象。
        Person person = new Person();
        // 通过反射：只需要一个名字，就可以创建对象
        String className = "com.example.sunming.fanshe.Person";
        Class<?> clazz = Class.forName(className);
        Person o = (Person) clazz.newInstance();

        ///3、调用有参构造方法初始化变量
        // 不用反射:通过构造方法实例化并初始化变量
        Person p = new Person("name", 18);
        System.out.println("不用反射:" + p);
        // 通过反射：Class对象的getConstructor方法拿到构造器
        Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
        //通过构造器的newInstance方法实例化并初始化变量
        Object p2 = constructor.newInstance("name2", 22);
        System.out.println("通过反射:" + p2);


    }
}
